<?php
/**
 * Nweb Framework
 *
 * This script is protected by copyright. It's use, copying, modification
 * and distribution without written consent of the author is prohibited.
 *
 * @category    source
 * @package     pl.nweb.framework.log
 * @author      Krzysztof Kardasz <krzysztof.kardasz@gmail.com>
 * @copyright   Copyright (c) 2011 Krzysztof Kardasz
 * @license     http://www.gnu.org/licenses/lgpl-3.0.txt  GNU Lesser General Public
 * @version     3.0 $Id: log.php 435 2011-09-23 13:24:30Z krzysztof.kardasz $
 * @link        http://code.google.com/p/nweb-framework/
 * @link        http://framework.nweb.pl
 */

namespace pl\nweb\framework;

/**
 * Log
 *
 * @category    source
 * @package     pl.nweb.framework.log
 * @author      Krzysztof Kardasz <krzysztof.kardasz@gmail.com>
 * @copyright   Copyright (c) 2011 Krzysztof Kardasz
 * @version     3.0 $Id: log.php 435 2011-09-23 13:24:30Z krzysztof.kardasz $
 */
abstract class Log implements log\iLog
{
    /**
     * Flaga, dziennik włączony / wyłączony
     *
     * @var boolean
     */
    private $_enabled = true;

    /**
     * Opcja, włączenie / wyłączenie dziennika
     */
    const OPTION_ENABLED = 'enabled';

    /**
     * Poziom wiadomości, informacja
     */
    const LEVEL_INFO = 1;

    /**
     * Poziom wiadomości, powiadomienie
     */
    const LEVEL_NOTICE = 2;

    /**
     * Poziom wiadomości, ostrzeżenie
     */
    const LEVEL_WARNING = 3;

    /**
     * Poziom wiadomości, błąd
     */
    const LEVEL_ERROR = 4;

    /**
     * Poziom wiadomości, błąd krytyczny
     */
    const LEVEL_CRITICAL = 5;

    /**
     * Poziom wiadomości, debugowanie
     */
    const LEVEL_DEBUG = 6;

    /**
     * Konstruktor
     *
     * @param array $options konfiguracja
     */
    public function __construct (array $options = array())
    {
        if(isset($options[self::OPTION_ENABLED])) {
            $this->setEnabled($options[self::OPTION_ENABLED]);
        }
    }

    /**
     * Definiowanie flagi czy Log jest włączony
     *
     * @param boolean $flag flaga
     * @return \pl\nweb\framework\Log
     */
    public function setEnabled ($flag)
    {
        $this->_enabled = (boolean)$flag;
        return $this;
    }

    /**
     * Zwraca flagę czy Log jest włączony
     *
     * @return boolean
     */
    public function isEnabled ()
    {
        return $this->_enabled;
    }

    /**
     * Zwraca tekst poziomu
     *
     * @param integer $level poziom
     * @return string
     * @throws \pl\nweb\framework\log\Exception
     */
    public function getLevel ($level)
    {
        $reflection = new \ReflectionClass($this);
        foreach($reflection->getConstants() as $name => $value) {
            if(substr($name, 0, 6) == 'LEVEL_' && $value == $level) {
                return substr($name, 6);
            }
        }
        throw new log\Exception ('Log level not exists');
    }
}